經過兩天的 WASM+WASI 概念建設之後,我們趕快回到跟 Docker 有關的部分吧!
沒錯,就是常見的的 Dockerfile。
# syntax=docker/dockerfile:1
# 第一區是用來安裝與設定 Rust 的工作環境
# 由於應用程式是以 Rust 語言撰寫的,因此此處的 Base Image 是 rust:latest
FROM --platform=$BUILDPLATFORM rust:latest AS buildbase
WORKDIR /
# 新增 Rust 的 wasm32-wasi 目標平台,必須新增此平台才能讓 Rust 能編譯成 WASM
RUN <<EOT bash
set -ex
rustup target add wasm32-wasi
EOT
# 第二區用來將應用程式編譯成 WASM 的格式
FROM buildbase AS build
RUN mkdir -p /hello
WORKDIR /hello
# 將範例中的 Cargo.toml(可以想像成 Rust 應用程式的設定檔案) 加入工作目錄
COPY Cargo.toml /hello
# 將範例中的程式碼複製進工作目錄
COPY src /hello/src
# 使用 cargo 來將 Rust 應用程式編譯成 WASM
RUN cargo build --release --target wasm32-wasi
# 最後則是製作給使用者用的 WASM Container Image
# 以 WASM 為主的環境,如 Day 3 所言,只需要一個 Wasm 檔案就能執行
# 因此我們可以用 scratch ,一個完全乾淨的 base image 來開始
FROM scratch
# 定義 Wasm+Container 該怎麼與此 Image 互動
ENTRYPOINT ["/hello.wasm", "Hello from", "WasmEdge"]
# 從第二區把編譯好的 WASM 放入目前的資料夾
COPY --link --from=build /hello/target/wasm32-wasi/release/hello.wasm /hello.wasm
如果上面的 Dockerfile 太過於複雜,我們可以將跟 Rust 應用程式有關的部分都拿掉,比如說開發者使用的是其他的程式語言,那我們可以將 Dockerfile 改成下面這個版本:
# syntax=docker/dockerfile:1
# 一樣是從乾淨的 base image 開始
FROM scratch
# 將工作目錄設定成根目錄 `/`
WORKDIR /
# 將編譯好的 WASM 檔案放入根目錄中
COPY hello.wasm /
# 設定進入點
ENTRYPOINT ["/hello.wasm", "Hello from", "WasmEdge"]